package com.aerospace.algorithm;

import java.util.LinkedList;
import java.util.Stack;

public class Codec {
    /**
     * 根据以下要求，实现字符串编码程序：
     * 1. 若当前字符是一个大于1的数字，且还有后继字符：则设当前字符为数字n，
     * 将它的后继字符（包括后继一个字符是一个数字字符）复制n+1次到新字符串。
     * 2. 若当前字符是‘_’：则将其变换为‘\UL’到新字符串。
     * 3. 若当前字符不满足上述条件：则复制该字符到新字符串。
     * 4. 上述一次变换为一组，不同组之间需插入一个字符‘_’用于分隔。
     * 例如：0abc_44经编码后的结果为0_a_b_c_\UL_44444_4
     * 要求：代码逻辑清晰、可读性好。
     **/
    public static String encode(String str) {
        String result = "";
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char aChar = chars[i];
            String sChar = String.valueOf(aChar);
            boolean isIntChar = isNum(sChar);
            //"_"以"\UL"替换
            if (sChar.equals("_")){
                result += "\\UL";
            }else {
                result+= sChar;
                if (isIntChar){
                    int intChar = Integer.valueOf(sChar);
                    //如果有后继字符且数字大于1，后继字符复制
                    if (intChar>1&&i<chars.length-1){
                        char nextChar = chars[i+1];
                        for (int j = 0; j < intChar; j++) {
                            result+= nextChar;
                        }
                    }
                }
            }
            //每组以"_"分隔
            result += "_";
        }
        return result;
    }

    /**
     * 判断某一个char是否是数字
     * @param sChar
     * @return
     */
    private static boolean isNum(String sChar) {
        boolean result = false;
        //转换成assci码
        int asci = sChar.charAt(0);
        //如果assci码值处于数字之间，判断为数字
        if (asci>48 &&asci<57){
            result = true;
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(encode("0abc_44"));
        System.out.println(decode("0_a_b_c_\\UL_44444_4"));
    }


    /**
     * 根据字符串编码程序的要求，实现对应的解码程序。
     **/
    public static String decode(String str) {
        String result = "";
        //每组以"_"分隔
        String[] strs = str.split("_");
        for (int i = 0; i < strs.length; i++) {
            String s = strs[i];
            char[] chars = s.toCharArray();
            boolean isInt = isNum(String.valueOf(chars[0]));
            if (isInt){
                //如果第一位是数字，直接连接第一位
                String a = String.valueOf(chars[0]);
                int charFirst = Integer.valueOf(a);
                result += charFirst+"";
            }else{
                //如果非数字直接连接当前全部
                result += s;
            }
        }
        //替换"\UL"
        result = result.replace("\\UL","_");
        return result;
    }
}

